相信大家在使用 IDE 的時候,都特別依賴已經幫我們寫好的快捷鍵 (ctrl + f 搜尋啊~ctrl + F 全域搜尋嗄~),當然之前我們也提到過 vim 的快捷鍵 (雖然對強大的 vim 來說那只是冰山一角~),只不過對於 vim 可以高度客製化的特性來說還是差得遠呢~
所以今天我們就來教大家,怎麼在 vim 的設定底下自己做幾個快捷鍵吧~
在 vim 底下宣告新的快捷鍵使用的是 map 這個指令,最基本的語法長這樣:
:map [key] [command]
就是快捷鍵 (key) 對應到預期執行的指令 (command)。
我們可以在 Command-line Mode 下 :map 來查看所有的快捷鍵對應:

而 :map! 則是只列出 Insert Mode 與 Command-line Mode 的快捷鍵:

咦?不是要講快捷鍵嗎?怎麼又講回模式了?
...
因為跟其他 IDE 不同的是,快捷鍵會根據模式的不同產生不一樣的效應,也就是說~你可以設定 ctrl + f 在 Visual Mode 下只搜尋選取的區域,也能在 Normal Mode 下搜尋整個檔案~
而在不同模式下要設定不同的快捷鍵,只需要在 map 前面增加模式的代碼就好囉!(不特別指定模式則只需要 map):
:nmap [key] [command]
像這樣就是在 Normal Mode 下才生效的快捷鍵~
這邊提供一張表給各位:
| 指令 | 模式 | 
|---|---|
:nmap | 
Normal Mode | 
:imap | 
Insert Mode | 
:vmap | 
Visual Mode & Select Mode | 
:smap | 
Select Mode | 
:xmap | 
Visual Mode | 
:cmap | 
Command-line Mode | 
:omap | 
Operator Pending Mode | 
假如你已經有一個寫好的快捷鍵了,又想要用另一個快捷鍵達成相同的功能呢?
:那還不簡單,我們就再把指令重寫一次就好!
那假如這個函式日後進行了更改,結果你沒改到另一個快捷鍵呢?
:... 那就用全域取代
recursive 提供我們用巢狀的方法去執行指令,假如你宣告的快捷鍵對應到的是另一個快捷鍵,那麼 vim 就會用此方法幫我們挖相依的快捷鍵~
不過如果你不喜歡這個功能怎麼辦?那你就關掉vim這個功能吧:
:nnoremap [key] [command]
此為在 Normal Mode 下對應一個非遞歸的快捷鍵。
既然可以設定,那就肯定可以取消設定~
:unmap
最後我們來實作一個快捷鍵吧!我想要按下空白鍵就可以折疊 & 展開這段的程式碼:
nnoremap <space> za <CR>
我們在 Day 04 說過 za 就是折疊 & 展開區塊的快捷鍵,所以這段的意思是:
在 Normal Mode 下按下 <space> 空白鍵,就幫我執行 za <CR> 的指令,並且不要遞歸執行
而 <CR> 就是按下 Enter 鍵,讓 za 這個指令生效~
太好了今天又可以在 vim 底下大玩快捷鍵了呢!